package com.lakeworks.service;

import com.github.pagehelper.PageInfo;
import com.lakeworks.common.core.domain.AjaxResult;
import com.lakeworks.domain.CompleteInfo;
import com.lakeworks.common.domain.system.OprDefeimg;
import com.lakeworks.common.domain.system.OprProductImg;
import com.lakeworks.domain.OprAttachment;
import com.lakeworks.domain.OprMerchandise;
import com.lakeworks.domain.OprProduct;
import com.lakeworks.domain.vo.*;

import javax.json.JsonObject;
import java.util.List;

/**
 * 作业产品Service接口
 *
 * @author lake
 * @date 2023-02-08
 */
public interface IOprProductService {

    /**
     * 查询作业产品
     *
     * @param id 作业产品主键
     * @return 作业产品
     */
    OprProduct selectOprProductById(Long id);

    /**
     * 查询作业产品列表
     *
     * @param oprProduct 作业产品
     * @return 作业产品集合
     */
    List<OprProduct> selectOprProductList(OprProduct oprProduct);

    /**
     * 新增作业产品
     *
     * @param oprProduct 作业产品
     * @return 结果
     */
    int insertOprProduct(OprProduct oprProduct);

    /**
     * 修改作业产品
     *
     * @param oprProduct 作业产品
     * @return 结果
     */
    int updateOprProduct(OprProduct oprProduct);

    /**
     * 根据产品id或companionId修改作业产品
     */
    int updateByIdOrCompanionId(OprProduct oprProduct);

    /**
     * 根据companionId修改作业产品
     */
    int updateByCompanionId(OprProduct oprProduct);

    /**
     * 批量删除作业产品
     *
     * @param ids 需要删除的作业产品主键集合
     * @return 结果
     */
    int deleteOprProductByIds(String ids);

    /**
     * 删除作业产品信息
     *
     * @param id 作业产品主键
     * @return 结果
     */
    int deleteOprProductById(Long id);


    /**
     * 衣物核查--查询商品列表
     *
     * @param expressNo
     */
    AjaxResult getProductList(String expressNo);

    /**
     * 衣物核查--查询附件列表
     *
     * @param
     */
    List<OprAttachment> getAttachmentList(Long oprProductId);

    /**
     * 衣物核查--查询产品图片列表
     *
     * @param
     */
    List<OprProductImg> getOprProductImgList(Long oprProductId, String imgType);

    /**
     * 质检---查询产品详情
     *
     * @param barcode
     */
    AjaxResult getProductByBarcode(String barcode);

    /**
     * 质检--质检合格
     *
     * @param barcode
     */
    AjaxResult qualified(String barcode, String code);

    /**
     * 质检--配对产品同时质检合格
     *
     * @param barcode
     */
    AjaxResult pairQualified(String barcode, String pairbarcode);


    /**
     * 质检--污渍终止
     *
     * @param barcode
     */
    AjaxResult stain(String barcode, String pairbarcode);

    /**
     * S3上传图片
     *
     * @param
     */
    JsonObject getUploadCredential();

    /**
     * 衣物核查--添加作业产品信息
     *
     * @param productVo
     */
    AjaxResult addOprProduct(ProductVo productVo);

    /**
     * 衣物核查--添加作业产品衣物类型
     *
     * @param flag id
     */
    int addProductType(Integer flag, Long id);

    /**
     * 衣物核查--删除作业产品衣物类型
     *
     * @param flag id
     */
    int deleteProductType(Integer flag, Long id);

    /**
     * 衣物核查--添加作业产品图片信息
     *
     * @param oprProductImg
     */
    AjaxResult addImg(OprProductImg oprProductImg);


    /**
     * 衣物核查--添加图片风险提报说明
     *
     * @param
     */
    AjaxResult addImgDesc(Long imgId, String remark);

    /**
     * 衣物核查--添加图片瑕疵信息
     *
     * @param
     */
    AjaxResult addDefeImg(OprDefeimg OprDefeimg);

    /**
     * 衣物核查--删除作业产品图片
     *
     * @param imgId
     */
    int delImg(Long imgId);

    /**
     * 衣物核查--删除瑕疵图片
     *
     * @param id
     */
    int delDefeImg(Long id);

    /**
     * 衣物核查--入厂核查
     *
     * @param oprProductIds
     * @param pickId
     */
    AjaxResult check(Long[] oprProductIds, Long pickId);

    OprProduct queryByBarcode(String barcode);


    OprProduct selectNoQCByBarcode(String barcode);

    OprProduct queryProductById(Long optProductId);

    List<OprProduct> selectByPickupId(Long pickupId);

    List<OprProduct> selectProductByShipmentId(Long id);

    List<OprProduct> selectByShipmentId(Long id);

    List<OprSysProduct> oprSysProductByShipmentId(Long id);

    List<OprProduct> selectByShipmentIdExcludeCompanion(Long shipmentId);

    /**
     * 添加附件
     */
    AjaxResult addProAttachment(Long oprProductId, Long sysAttachmentId,String complete);

    /**
     * 移除附件
     *
     * @param oprProductId    产品id
     * @param oprAttachmentId 附件id（非系统附件）
     */
    AjaxResult delProAttachment(Long oprProductId, Long oprAttachmentId);

    /**
     * 总检-配附件
     */
    AjaxResult attsOfProduct(String barcode);

    /**
     * 附件扫描
     */
    AjaxResult attachmentScan(String proBarcode, String attBarcode);

    /**
     * 包装
     */
    AjaxResult wrap(String barcode);


    AjaxResult boxCheck(String boxCode, String barcode);

    /**
     * 打包详情对象
     */
    PackageDetailVO packageDetail(Long shipmentId);

    /**
     * 打包详情
     */
    AjaxResult packageDetail(String barcode);

    AjaxResult clothes(String status, PackageQueryPara packageQueryPara);

    AjaxResult shipments(String status, PackageQueryPara packageQueryPara);


    int updateStatueByBarcode(String barcode, String status);

    /**
     * 上架
     */
    AjaxResult putaway(String barcode, boolean flag);

    /**
     * 作业产品进洗涤车间
     *
     * @param
     */
    AjaxResult washing(String barcode, boolean flag);

    /**
     * 作业产品出洗涤车间
     *
     * @param
     */
    AjaxResult washed(String barcode, boolean flag);

    /**
     * 作业产品待质检(进行粘毛去球后处理)
     *
     * @param
     */
    AjaxResult toinspect(String barcode, boolean flag);

    /**
     * 作业产品拣货
     *
     * @param
     */
    AjaxResult topick(String barcode, boolean flag);

    /**
     * 出厂
     */
    AjaxResult outFactory(String expressNo);

    /**
     * 打包扫描
     */
    AjaxResult packageScan(String barcode);

    AjaxResult printCheckLable(String barcode);

    AjaxResult labelScan(String expressNo);

    AjaxResult addMerchandise(OprMerchandise oprMerchandise);

    /**
     * 质检--反洗
     *
     * @param barcode
     */
    AjaxResult rewash(String barcode, String comment);

    /**
     * 查询产品瑕疵列表
     *
     * @param
     */
    AjaxResult getFlawsList(Long oprProductId);

    /**
     * 打包---取消出厂单
     */
    AjaxResult cancelShipment(String shipmentNo);


    /**
     * 修改入厂单以及所属产品的标签
     *
     * @param pickupId 入场单id
     *                 code 方式 true添加标签  false 删除标签
     *                 flag 标签枚举具体值
     */
    String updatePickupFlag(Long pickupId, boolean code, Integer flag);


    /**
     * 修改出厂单以及所属产品的标签
     *
     * @param shipmentId 出场单id
     *                   code 方式 true添加标签  false 删除标签
     *                   flag 标签枚举具体值
     */
    String updateShipmentFlag(Long shipmentId, boolean code, Integer flag);


    /**
     * 修改产品的标签
     *
     * @param product 产品对象
     *                code 方式 true添加标签  false 删除标签
     *                flag 标签枚举具体值
     */
    String updateProductFlag(OprProduct product, boolean code, Integer flag);


    /**
     * 暂停整个订单的产品
     *
     * @param code 方式 true添加标签  false 删除标签
     *             flag 标签枚举具体值
     */
    String holdingOrder(String orderNo, boolean code);

    //String notWash(String barcode);

   /* AjaxResult loseAttachment(String barcode, List<String> names, String remark);

    AjaxResult afterSale(String barcode, List<String> imgs, String remark);*/

    AjaxResult getOrderInfo(String barcode);

    AjaxResult delOprProduct(Long id);

    List<OprProduct> selectByBarcodeAndStatus(String status, PackageQueryPara packageQueryPara);

    int selectCountByBarcodeAndStatus(String status, PackageQueryPara para);

    int updateProduct(OprProduct oprProduct);

    PageInfo<ClothInfo> getOprProducts(ClothInfo clothInfo);


    List<OprProduct> selectClothList(ClothInfo clothInfo);


    List<OprProduct> selectProductByOrderNo(String orderNo);

    List<OprProductImg> selectImgByProductId(Long productId);


    AjaxResult getBarcodeRecord(String barcode);

    AjaxResult leaveFactory(Long channelId,String washMode, String startTime, String endTime);

    OprProduct selectProductByBarcodeAndStatus(OprProduct oprProduct);

    OprProduct selectOprProductByMerchandiseId(Long merchandiseId);


    OprProduct queryByCompanionId(Long companionId);

    AjaxResult completeCloth(String barcode);

    AjaxResult complete(CompleteInfo completeInfo);
}

